import { _k } from "./index.js"

//    三角形面积公式
// 方法1：行列式
// 设三角形的面积为S， 则S = (1/2)*(下面行列式)
// |x1 y1 1| 
// |x2 y2 1| 
// |x3 y3 1|
// 即 S=(1/2)*(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2) = (1 / 2) * ((x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1));
// 两向量叉乘==两向量构成的平行四边形(以两向量为邻边)的面积
export const triArea = (a, b, c) => {
    return ((a[0] - c[0]) * (b[1] - c[1]) - (a[1] - c[1]) * (b[0] - c[0])) / 2
}

// 方法2：海伦公式
// 海伦公式 利用三角形的三条边的边长直接求三角形面积的公式 S=√p(p-a)(p-b)(p-c) ,p=(a+b+c)/2
// 　　S = sqrt (p * (p - a)(p - b)(p - c))  其中p = (a + b + c) / 2, abc为三角形三边长

// 　　代码：
// 代码：


// 四个点的交叉点
//    算法三: 判断每一条线段的两个端点是否都在另一条线段的两侧, 是则求出两条线段所在直线的交点, 否则不相交.
// 不通过法线投影来判断点和线段的位置关系, 而是通过点和线段构成的三角形面积来判断.
// 如果”线段ab和点c构成的三角形面积”与”线段ab和点d构成的三角形面积” 构成的三角形面积的正负符号相异,
// 那么点c和点d位于线段ab两侧.
export const segmentsIntr = ([a, b], [c, d]) => {

    // 三角形abc 面积
    var area_abc = triArea(a, b, c)  //(a[0] - c[0]) * (b[1] - c[1]) - (a[1] - c[1]) * (b[0] - c[0]);

    // 三角形abd 面积
    var area_abd = triArea(a, b, d)  //(a[0] - d[0]) * (b[1] - d[1]) - (a[1] - d[1]) * (b[0] - d[0]);

    // 面积符号相同则两点在线段同侧,不相交 (对点在线段上的情况,本例当作不相交处理); 
    if (area_abc * area_abd >= 0) {
        return false;
    }

    // 三角形cda 面积
    var area_cda = triArea(c, d, a)  //(c[0] - a[0]) * (d[1] - a[1]) - (c[1] - a[1]) * (d[0] - a[0]);
    // 三角形cdb 面积的2倍 
    // 注意: 这里有一个小优化.不需要再用公式计算面积,而是通过已知的三个面积加减得出. 
    var area_cdb = area_cda + area_abc - area_abd;
    if (area_cda * area_cdb >= 0) {
        return false;
    }

    //计算交点坐标 
    var t = area_cda / (area_abd - area_abc);
    var dx = t * (b[0] - a[0]),
        dy = t * (b[1] - a[1]);
    return [_k(a[0] + dx), _k(a[1] + dy)];
}

